/**
 * @file demo4.cpp
 * @author your name (you@domain.com)
 * @brief 测试多层lambda函数嵌套
 * @version 0.1
 * @date 2023-12-23
 * 
 * @copyright Copyright (c) 2023
 * 
 */
#include <iostream>
#include <string>
#include <memory>
#include <functional>

using namespace std;

using ServerWorkCallback = std::function<void(string, int)>;
using GetResultCallback = std::function<void(int)>;


class Server{
public:
    void register_request(const ServerWorkCallback& callback){
        _callback = callback;
    }
    void do_work(){
        _callback(_name, _result);
    }
    void set_result(int result){
        _result = result;
    }
private:
    ServerWorkCallback _callback;
    string _name{"server"};
    int _result;

};


class Websit{
public:
    Websit(shared_ptr<Server> server):_server{server}{
    }

    // 通过二次嵌套，新创建一个lambda函数作为外部嵌套的回调，并在该函数中执行用户回调
    void add_click_request(const GetResultCallback& callback){
        _server->register_request([this, callback](string name, int result){
            cout << "Server name: " << name << endl;
            callback(result); // 可以直接执行用户回调函数
            // user_callback(callback, result); // 可以通过另外一个成员函数进行一次封装处理
            });
    }

    void user_callback(const GetResultCallback& callback, int result){
        auto tmp_callback = callback;
        tmp_callback(result);
    }
private:
    shared_ptr<Server> _server;
};

// 用户的回调函数
void user_get_result(int result){
    cout << "user: " << result << endl;
}

/**
 * @brief 测试
 * 
 */
void test01(){
    shared_ptr<Server> server = make_shared<Server>();
    Websit websit{server};

    //
    websit.add_click_request(&user_get_result); // 绑定用户回调函数
    server->set_result(100); // Server进行了一些处理

    //
    server->do_work();
}

int main(int argc, char *argv[]){

    test01();
    return 0;
}

